{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "from sklearn import datasets, linear_model, cross_validation, svm"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 使用鸢尾花数据\n",
    "def load_data():\n",
    "    iris = datasets.load_iris()\n",
    "    x_train = iris.data\n",
    "    y_train = iris.target\n",
    "    return cross_validation.train_test_split(x_train, y_train, test_size = 0.25, random_state = 0, stratify = y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Coefficients:[[ 0.20959392  0.39923779 -0.81739259 -0.4423183 ]\n",
      " [-0.12943829 -0.78367336  0.52000074 -1.02409687]\n",
      " [-0.80296181 -0.87608296  1.21356733  1.81000197]], intercept [ 0.119738    2.03628071 -1.44375306]\n",
      "Score: 0.9736842105263158\n"
     ]
    }
   ],
   "source": [
    "# 线性分类器LinearSVC\n",
    "def test_LinearSVC(*data):\n",
    "    x_train, x_test, y_train, y_test = data\n",
    "    svc = svm.LinearSVC()\n",
    "    svc.fit(x_train,y_train)\n",
    "    print('Coefficients:{0}, intercept {1}'.format(svc.coef_, svc.intercept_))\n",
    "    print('Score: {0}'.format(svc.score(x_test, y_test)))\n",
    "\n",
    "x_train, x_test, y_train, y_test = load_data()\n",
    "test_LinearSVC(x_train, x_test, y_train, y_test )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "hinge\n",
      "Coefficients:[[ 0.36637401  0.32164134 -1.07534387 -0.57004977]\n",
      " [ 0.47106798 -1.55787524  0.39835903 -1.34695567]\n",
      " [-1.21290848 -1.15164257  1.85318358  1.97845665]], intercept [ 0.18050384  1.34290245 -1.43590004]\n",
      "Score: 0.9736842105263158\n",
      "squared_hinge\n",
      "Coefficients:[[ 0.20959201  0.39924182 -0.81738995 -0.44231421]\n",
      " [-0.12812173 -0.78720985  0.52072245 -1.02332296]\n",
      " [-0.80298341 -0.87646055  1.21359788  1.80987618]], intercept [ 0.11973942  2.04243821 -1.44436839]\n",
      "Score: 0.9736842105263158\n"
     ]
    }
   ],
   "source": [
    "# 损失函数对结果的影响\n",
    "def test_LinearSVC_loss(*data):\n",
    "    x_train, x_test, y_train, y_test = data\n",
    "    losses = ('hinge','squared_hinge')\n",
    "    for loss in losses:\n",
    "        svc = svm.LinearSVC(loss=loss)\n",
    "        svc.fit(x_train,y_train)\n",
    "        print(loss)\n",
    "        print('Coefficients:{0}, intercept {1}'.format(svc.coef_, svc.intercept_))\n",
    "        print('Score: {0}'.format(svc.score(x_test, y_test)))\n",
    "\n",
    "x_train, x_test, y_train, y_test = load_data()\n",
    "test_LinearSVC_loss(x_train, x_test, y_train, y_test )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "panalty:l1\n",
      "Coefficients:[[ 0.16232657  0.52363926 -0.93207016  0.        ]\n",
      " [-0.15452877 -0.9082551   0.48326127 -0.93365227]\n",
      " [-0.5703139  -0.85186166  0.97134702  2.31141743]], intercept [ 0.          2.59055611 -2.60668505]\n",
      "Score: 0.9736842105263158\n",
      "panalty:l2\n",
      "Coefficients:[[ 0.20966721  0.39922563 -0.81739423 -0.44237657]\n",
      " [-0.13079574 -0.7872181   0.52298032 -1.02445961]\n",
      " [-0.80308922 -0.87656106  1.21391169  1.81021937]], intercept [ 0.11945388  2.04805235 -1.44409296]\n",
      "Score: 0.9736842105263158\n"
     ]
    }
   ],
   "source": [
    "# 惩罚项形式的影响\n",
    "def test_LinearSVC_L12(*data):\n",
    "    x_train, x_test, y_train, y_test = data\n",
    "    L12 = ('l1','l2')\n",
    "    for l in L12:\n",
    "        svc = svm.LinearSVC(penalty=l,dual=False)\n",
    "        svc.fit(x_train,y_train)\n",
    "        print('panalty:{0}'.format(l))\n",
    "        print('Coefficients:{0}, intercept {1}'.format(svc.coef_, svc.intercept_))\n",
    "        print('Score: {0}'.format(svc.score(x_test, y_test)))\n",
    "\n",
    "x_train, x_test, y_train, y_test = load_data()\n",
    "test_LinearSVC_L12(x_train, x_test, y_train, y_test )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 惩罚项系数的影响\n",
    "def test_LinearSVC_C(*data):\n",
    "    train_x,test_x, train_y, test_y = data\n",
    "    Cs = np.logspace(-2,1)\n",
    "    train_score = []\n",
    "    test_score = []\n",
    "    for C in Cs:\n",
    "        svc = svm.LinearSVC(C=C)\n",
    "        svc.fit(train_x,train_y)\n",
    "        train_score.append(svc.score(train_x,train_y))\n",
    "        test_score.append(svc.score(test_x,test_y))\n",
    "            \n",
    "    # 绘图：\n",
    "    fig = plt.figure()\n",
    "    ax = fig.add_subplot(111)\n",
    "    ax.plot(Cs,train_score,label='Training Score')\n",
    "    ax.plot(Cs,test_score, label='Testing Score')\n",
    "    ax.set_xlabel(r'C')\n",
    "    ax.set_ylabel('score')\n",
    "    ax.set_title('LinearSVC')\n",
    "    ax.set_xscale('log')\n",
    "    ax.legend(loc='best')\n",
    "    plt.show()\n",
    "    \n",
    "x_train, x_test, y_train, y_test = load_data()\n",
    "test_LinearSVC_C(x_train, x_test, y_train, y_test )"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
